<?php

class Cache_Frontend_Page extends Zend_Cache_Frontend_Page 
{
    /**
     * Constructor
     *
     * @param  array   $options                Associative array of options
     * @param  boolean $doNotTestCacheValidity If set to true, the cache validity won't be tested
     * @throws Zend_Cache_Exception
     * @return void
     */
    public function __construct(array $options = array())
	{
		$this->_options['minimum_data_length'] = 0;
		$this->_options['nginx_simple_key'] = 0;
		$this->_options['nginx_simple_key_log'] = 0;
		parent::__construct($options);
	}
	
    /**
     * Test if a cache is available for the given id and (if yes) return it (false else).
     * В метод встроена защита от пустого кэша, если длина закэшированного контента меньше X строчек, то мы выдаем промах кэша.
     * Кроме этого в метод встроена посылка заголовка Cache-Page: 1 если кэш не промахнулся.
     *
     * @param  string  $id                     Cache id
     * @param  boolean $doNotTestCacheValidity If set to true, the cache validity won't be tested
     * @param  boolean $doNotUnserialize       Do not serialize (even if automatic_serialization is true) => for internal use
     * @return mixed|false Cached datas
     */
    public function load($id, $doNotTestCacheValidity = false, $doNotUnserialize = false)
    {
    	$array = parent::load($id, $doNotTestCacheValidity, $doNotUnserialize);
    	if (!isset($array['data'])) {
    		return false;
    	}
    	
    	$length = $this->getOption('minimum_data_length');
    	
    	if (strlen($array['data']) < $length) {
    		return false;
    	}

    	if (!headers_sent()) {
    		header("Cache-Page: 1");
    	}
    	return $array;
    }
    
    /**
     * Делаем дополнительную запись в memcache для nginx.
     *
     * @param  string $data Buffered output
     * @return string Data to send to browser
     */
    public function _flush($data)
    {
        if ($this->_cancel) {
            return $data;
        }

        $data = parent::_flush($data);
        if (!$this->getOption('nginx_simple_key')) {
        	return $data;
        }
        
        $memcache = Cache_Manager::getInstance()->getBackend()->getRawClass();
        $key = 'nginx_' . $_SERVER['HTTP_HOST'] . md5(urldecode($_SERVER['REQUEST_URI']));

	$file = $this->getOption('nginx_simple_key_log');
	if ($file) {
		$f = fopen($file, 'a');
		fwrite($f, date("[Y-m-d H:i:s] ") . urldecode($_SERVER['REQUEST_URI']) . ' ' . $key . "\n");
		fclose($f);
	}

        $memcache->set($key, $data, 0, (int)$this->getOption('lifetime'));
        return $data;
    }
}
